package br.gov.sjc.aluguelsocial;

import java.io.FileOutputStream;

import br.gov.sjc.aluguelsocial.R.id;
import br.gov.sjc.classes.NumeroSias;
import br.gov.sjc.dao.BaseDAO;
import br.gov.sjc.dao.DadosPessoaisDAO;
import br.gov.sjc.dao.DocumentosDAO;
import br.gov.sjc.dao.EnderecoDAO;
import br.gov.sjc.dao.EscolaridadeDAO;
import br.gov.sjc.dao.GrupoFamiliarDAO;
import br.gov.sjc.dao.LocalizadoDAO;
import br.gov.sjc.dao.NomeDAO;
import br.gov.sjc.export.SincronizarDados;
import br.gov.sjc.utils.Ambiente;
import br.gov.sjc.utils.Sair;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class AluguelSocialAct extends Sair {

	static final int DATE_DIALOG_ID = 0;
	private static final String TAG = "AluguelSocialAct";
	//Declara Cursor
	Cursor Verifica;

	//Declara base de dados
	public static SQLiteDatabase BancoDados = null;
	public static String nomeBanco = BaseDAO.DATABASE_NAME;
	public void openDB(){
		try{
			//File dbFile = new File(Environment.getExternalStorageDirectory(), nomeBanco);
			//BancoDados = SQLiteDatabase.openOrCreateDatabase(dbFile,null);

			BancoDados = openOrCreateDatabase(nomeBanco,MODE_WORLD_READABLE,null);
			Log.v(TAG, "BancoDados.openOrCreateDatabase();");
		}catch (Exception E){
			Log.e(TAG, "Erro em BancoDados.close();"+E.getMessage());
		} 
	}
	public void closeDB(){
		BancoDados.close();
		Log.v(TAG, "BancoDados.close();");
	}

	//Declara Variáveis
	String data2;

	//Declara os itens

	Button  btNovaPesquisa, btSincronizar, btSair, btConfs;
	TextView tvTitle;


	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		registerBaseActivityReceiver();

		tvTitle = (TextView)findViewById(id.lblTitle);
		
		/*
		 * Verifica se o sistema está apontado para banco de Produção
		 */
		Ambiente a = new Ambiente();
		String t = null;
		
		t = a.VerificaAmbiente(this);
		
		if (t.equals("Produção")){
			tvTitle.setText("Pesquisa Sias");
		}else{
			tvTitle.setText("Pesquisa Sias(Teste)");
		}
		
		
		//Metodos
		zeraNumeroDeMembroSias();
		criaBanco();
		populaBanco();
		criapastas();
		String msg = "Pastas Ok";
		Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
		
		
		
		//Inicio da aï¿½ï¿½o do Botao da pesquisa
		btNovaPesquisa = (Button) findViewById(R.id.btNovaPesquisa);
		btNovaPesquisa.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				ittIr();
			}
		});//fim acao do botao pesquisa

		//Inicio da aï¿½ï¿½o do Botao de btConfs
		btConfs = (Button) findViewById(R.id.btConfs);
		btConfs.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				ittConfs();
			}
		});//fim acao do botao pesquisa

		//Inicio da aï¿½ï¿½o do Botao da pesquisa
		btSair = (Button) findViewById(R.id.btSair);
		btSair.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				closeAllActivities();
			}
		});//fim acao do botao pesquisa



		/**
		 * chama a sincronização de Exportação
		 */
		btSincronizar = (Button) findViewById(R.id.btSincronizar);
		btSincronizar.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				//Este button apenas grava o nome do tecnico e a data que irï¿½ realizar a pesquisa

				chamaExportacao();
			}
		});//fim acao do botao pesquisa

	}
	public void zeraNumeroDeMembroSias() {
		NumeroSias ns = new NumeroSias();
		ns.setZeroNumeroDoMembroDaFamilia();

	}
	protected void ittConfs() {
		/** InitComponents*/
		Intent ittConfs = new Intent(getApplicationContext(), ConfigurarActivity.class);
		startActivity(ittConfs);
	}
	protected void ittIr() {
		/** InitComponents*/
		Intent ittPesquisa = new Intent(getApplicationContext(), progressoActivity.class);
		startActivity(ittPesquisa);
	}
	public void chamaExportacao (){ 
		if (temDadosParaSincronizar()){
			// encaminha para a activity que realizarï¿½ a exportaï¿½ï¿½o dos dados
			if (TemConexao()){
				Intent ittPesquisa = new Intent(getApplicationContext(), SincronizarDados.class);
				startActivity(ittPesquisa);
			}else{
				mensagemAlerta("Rede","Não foi possível conectar com a rede");
			}
		}else{ 
			mensagemAlerta("Dados","Não existem dados alterados");
		}
	}
	public void criaBanco(){
		openDB();
		try{
			//File dbFile = new File(Environment.getExternalStorageDirectory(), nomeBanco);
			//BancoDados = SQLiteDatabase.openOrCreateDatabase(dbFile,null);
			//BancoDados = openOrCreateDatabase(nomeBanco,MODE_WORLD_READABLE,null);
			

			String SQL = "CREATE TABLE IF NOT EXISTS tab_Configuracao(_id INTEGER PRIMARY KEY, Nome TEXT,Matricula TEXT,Obs TEXT,PlacaPatrimonial TEXT, Data TEXT)";
			BancoDados.execSQL(SQL);
			String SQL2 = "CREATE TABLE IF NOT EXISTS tab_Progresso(_id INTEGER PRIMARY KEY, SiasN INT, etapa TEXT, Descricao TEXT)";
			BancoDados.execSQL(SQL2);
			
			// OO
			NomeDAO ndao = new NomeDAO(this);
			ndao.onCreate(BancoDados);
			// OO
			EnderecoDAO edao = new EnderecoDAO(this);
			edao.onCreate(BancoDados);
			// OO
			LocalizadoDAO ldao = new LocalizadoDAO(this);
			ldao.onCreate(BancoDados);
			// OO
			DadosPessoaisDAO dpdao = new DadosPessoaisDAO(this);
			dpdao.onCreate(BancoDados);
			// OO
			EscolaridadeDAO esdao = new EscolaridadeDAO(this);
			esdao.onCreate(BancoDados);
			// OO
			DocumentosDAO ddao = new DocumentosDAO(this);
			ddao.onCreate(BancoDados);
			// OO
			GrupoFamiliarDAO gfdao = new GrupoFamiliarDAO(this);
			gfdao.onCreate(BancoDados);
			// OO
			BaseDAO bdao = new BaseDAO(this);
			bdao.onCreate(BancoDados);
			
			/*String SQL14 = "DROP VIEW IF EXISTS vw_total";
			BancoDados.execSQL(SQL14);
			String SQLView = "CREATE VIEW IF NOT EXISTS vw_total AS "+ 
					"select * from "+
					"tab_GrupoFamiliar as GF, "+
					"tab_Endereco as E, "+
					"tab_Localizado as L, "+
					"tab_Nome as N, " +
					"tab_DadosPessoais as DP, " +
					"tab_Escolaridade as Es, " +
					"tab_Documentos as D, " +
					//"tab_IndSegAlimen as ISA, " +
					//"tab_AcessoAlimen as AA, " +
					"tab_Trabalho as T, " +
					"tab_TrabalhoOFR as TOFR  "+
					"Where "+
					"E.SiasN = GF.SiasN AND "+
					"L.SiasN = GF.SiasN ";
			BancoDados.execSQL(SQLView);
			 Bloco retirado da construï¿½ï¿½o da View
			 * OR ("+
	        		"N.SiasN = GF.SiasN AND "+
	        		"N.idMembro = GF.idMembro AND " +
	        		"DP.SiasN = GF.SiasN AND " +
	        		"DP.idMembro = GF.idMembro AND " +
	        		"Es.SiasN = GF.SiasN AND " +
	        		"Es.idMembro = GF.idMembro AND " +
	        		"D.SiasN = GF.SiasN AND " +
	        		"D.idMembro = GF.idMembro  AND " +
	        		"ISA.SiasN = GF.SiasN AND " +
	        		"AA.SiasN = GF.SiasN AND "  +
	        		"T.SiasN = GF.SiasN AND " +
	        		"TOFR.SiasN = GF.SiasN AND " +
	        		"(T.idMembro = GF.idMembro OR " +
	        		"TOFR.idMembro = GF.idMembro))
			 */

			
			Log.i(TAG, "criaBanco() executado com sucesso");

		}catch(Exception erro) {
			mensagemAlerta("Erro","Erro ao criar banco");
			erro.printStackTrace();
			Log.e(TAG, "Erro em criaBanco(): "+erro.getMessage());

		}
			closeDB();
		
	}
	private boolean TemConexao() {
		boolean lblnRet = false;
		try
		{
			ConnectivityManager cm = (ConnectivityManager)
			getSystemService(Context.CONNECTIVITY_SERVICE);
			if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected()) {
				lblnRet = true;
			} else {
				lblnRet = false;
			}
		}catch (Exception e) {
			Log.e(TAG, "TemConexao - Erro: "+e.getMessage());
		}
		return lblnRet;
	}

	private boolean temDadosParaSincronizar(){
		boolean retorno = false;
		openDB();
		try{
			Log.v(TAG, "verificaRegistro() Início");
			String SQLQuery = "Select * from tab_Localizado";
			Cursor cursor = BancoDados.rawQuery(SQLQuery, null);
			int counter = cursor.getCount();
			cursor.moveToFirst();
			
			String SQLQuery2 = "Select * from tab_Nome";
			Cursor cursor2 = BancoDados.rawQuery(SQLQuery2, null);
			int counter2 = cursor2.getCount();
			cursor.moveToFirst();
			
			if ( (counter != 0 && counter2 != 0)||(counter == 0 && counter2 == 0)){
				retorno = true;
				Log.i(TAG, "verificaRegistro() !=0  e counter="+counter);
			}else{
				Log.e(TAG, "Erro: Verifica.getCount() =0 e counter="+counter);
			}
		}catch (Exception Err){
			mensagemAlerta("Erro","Erro Encontrado");
			Log.e(TAG, "Erro: "+Err.getMessage());
		}
		closeDB();
		return retorno;
	}
	
	public void mensagemAlerta(String AlertTitle, String MSGAlert){
		AlertDialog.Builder Mensagem = new AlertDialog.Builder(this);
		Mensagem.setTitle(AlertTitle);
		Mensagem.setMessage(MSGAlert);
		Mensagem.setNeutralButton("Ok", null);
		Mensagem.show();
	}

	public boolean populaBanco(){
		boolean ResultadoPopula = false;
		Log.v(TAG, "ResultadoPopula = false");
		
		try{

			if (verificaRegistro()){
				Log.v(TAG, "verificaRegistro() Existem Dados");
			}else{
				
				openDB();
				String insertC = "insert into tab_Configuracao (Nome, Matricula, Obs, PlacaPatrimonial)values ('----', '0000', '', '225823');";
				BancoDados.execSQL(insertC);
				closeDB();
				
				Log.v(TAG, "populaBanco() executado com sucesso");
				ResultadoPopula = true;
			}


		}catch(Exception e){
			mensagemAlerta("Erro","Erro Ao Criar Banco ");
			Log.e(TAG, "populaBanco() erro:"+e.getMessage());
		}finally{
			
		}
		return ResultadoPopula;
	}
	public boolean verificaRegistro(){
		boolean Retorno = false;
		openDB();
		try{
			Log.v("progressoActivity", "verificaRegistro() Início");
			//String SQLQuery = "Select * from tab_GrupoFamiliar WHERE SiasN="+NumSias+" ";
			String SQLQuery = "Select * from tab_Nome Order By SiasN ASC";
			Verifica = BancoDados.rawQuery(SQLQuery, null);
			int counter = Verifica.getCount();
			Verifica.moveToFirst();

			if ( counter !=0 ){

				Retorno = true;
				Log.i("progressoActivity", "verificaRegistro() !=0  e counter="+counter);
			}else{
				Log.e("progressoActivity", "Erro: Verifica.getCount() =0 e counter="+counter);

			}
		}catch (Exception Err){
			mensagemAlerta("Erro","Erro Encontrado");

			Log.e("progressoActivity", "Erro: "+Err.getMessage());
		}
		closeDB();
		return Retorno;
	}
	private String PlacaPatrimonial(int id){
		String retorno = "";
		Cursor cVerifica = null;
		openDB();
		if (BancoDados.isOpen()){
			Log.v(TAG, "BD isOpen");
			try{
				
				String SQLQuery = "Select * from tab_Configuracao WHERE _id="+id;
				cVerifica = BancoDados.rawQuery(SQLQuery, null);
				cVerifica.moveToFirst();
				retorno = cVerifica.getString(cVerifica.getColumnIndex("PlacaPatrimonial"));
				Log.i(TAG,"PlacaPatrimonial():"+retorno);
			}catch(Exception e){
				Log.e(TAG,"PlacaPatrimonial():"+retorno+" / ERRO - "+e.getMessage());
				
			}
		}else{
			Log.e(TAG,"BD not Open");
		}
		closeDB();
		return retorno;
	}
	private boolean criapastas(){
		boolean retorno = false;
		
		//String NomeArquivo = "aluguelSocial-";
		String NomeArquivo = BaseDAO.NOME_ARQUIVO;
		//openDB();	
		//TODO: Chamando o ID = 1 (somente deve existir esse ID nessa tabela.)
		NomeArquivo += PlacaPatrimonial(1);
		Log.i(TAG, "XML - Nome do arquivo:"+NomeArquivo);
		//closeDB();
		String espaco = " ";
	      //transforma o texto digitado em array de bytes
        byte[] dados = espaco.getBytes();
        
         
        try{
    		FileOutputStream fosIN = openFileOutput(NomeArquivo+"d.xml", Context.MODE_PRIVATE);
    		//fosIN.write(dados);
    		fosIN.close();
        	retorno = true;
        }catch(Exception e){
        	Log.e(TAG, "ERRO - IN:"+e.getMessage());
        	retorno = false;
        }
        try{
    		FileOutputStream fosOUT = openFileOutput(NomeArquivo+"u.xml", Context.MODE_PRIVATE);
    		//fosOUT.write(dados);
    		fosOUT.close();
        	retorno = true;
        }catch(Exception e){
        	Log.e(TAG, "ERRO - OUT:"+e.getMessage());
        	retorno = false;
        }
        
		
		return retorno;
	}
	
	@Override
	protected void onResume() {
		//quando a Activity main receber o foco novamente abre-se novamente a conexÃ£o
		//mÃ©todo responsÃ¡vel pela atualiza da lista de dados na tela
		//adapter.notifyDataSetChanged();
		super.onResume();
	}
	@Override
	protected void onPause() {

		//toda vez que o programa peder o foco fecha-se a conexÃ£o com o BD
		
		super.onPause();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unRegisterBaseActivityReceiver();
		finish();
	}
}
